package com.endurance.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ProjectName: spring-cloud-hoxton-parent
 * @Package: com.endurance.controller
 * @ClassName: DemoController
 * @Description:
 * @Author: sunlin
 * @CreateDate: 2024/02/06 20:40
 * @Version: 1.0
 */

@RestController
@RequestMapping("/demos")
public class DemoController {
    /**
     * 通过 openfeigh 和 hystrix 实现服务降级
     *
     * @param id
     * @return
     */
    @GetMapping("demos")
    public String tests() {
        System.out.println("demos demos:");
        return "demos demos:";
    }


    /**
     * 这种情况，如果出现异常，都会走完一边业务流程
     * 使用Hystrix之后，如果达到与之，能够快速响应，直接调用fallbackMethod，不会指向原方法里的内容
     *
     * @param id
     * @return
     */
    @GetMapping
    @HystrixCommand(fallbackMethod = "demoBreakFall", defaultFallback = "defaultFallback")
//    @HystrixCommand(defaultFallback = "defaultFallback")
    // defaultFallback 默认的备选方案，要求返回值为String
    public String demo(@RequestParam Integer id) {
        System.out.println("demo ok:" + id);
        if (id <= 0) throw new RuntimeException("无效的id");
        return "demo service ok!!!";
    }

    /**
     * 断路器：默认打开条件： 当10s内如果有20个请求失败，或者50%请求失败，自动触发断路器自动打开  当断路器打开5s以后断路器会进入半开状态，如果请求成功会关闭断路器
     *
     * @param id
     * @return
     */
    public String demoBreakFall(@RequestParam Integer id) {
        System.out.println("熔断方法！！！");
        return id + "不合法";
    }

    public String defaultFallback() {
        System.out.println("defaultFallback熔断方法！！！");
        return "不合法-defaultFallback";
    }

}
